# 工具使用 - MCP Model Context Protocol


**定义**：MCP（Model Context Protocol，模型上下文协议）是由 Entropy 提出的一个标准，旨在为大型语言模型（LLM）提供一种标准化的方式来访问外部工具和数据源。
**目的**：解决开发者在构建智能体式应用时，需要为每个应用重复编写代码来集成不同工具（如 Slack, GitHub, Google Drive 等）的痛点。
**现状**：该协议已被许多公司和开发者广泛采用，形成了一个活跃的生态系统。

---

## 一、问题与解决方案

### 传统开发模式的问题

**重复造轮子**：
    - 开发者 A 构建 App 1，需要集成 Slack、Google Drive、GitHub 和 PostgreSQL。
    - 开发者 B 构建 App 2，同样需要集成这些工具。
    - 每个应用都必须独立编写封装代码来调用各个工具的 API。
    - 如果有 `m` 个应用和 `n` 个工具，整个社区的工作量是 `m × n`，效率低下且浪费资源。

### MCP 的解决方案

- **引入共享服务器**：MCP 提出了一种标准，允许应用程序通过一个共享的 MCP 服务器来访问工具和数据源。
- **工作量优化**：
    - 不再是每个应用都创建自己的工具封装。
    - 只需要开发 `n` 个 MCP 服务器（每个对应一个工具），然后让 `m` 个应用去连接这些服务器。
    - 整个社区的工作量从 `m × n` 降低到 `m + n`，实现了巨大的效率提升。

![alt text](../images/3.7.1.png)
---

## 二、MCP 的核心组件

### 1. 客户端 (Clients)

- **角色**：希望访问外部工具或数据的应用程序。
- **示例**：Cursor, Claude Desktop, Windsurf。
- **功能**：向 MCP 服务器发送请求，获取数据或执行操作。

### 2. 服务器 (Servers)

- **角色**：提供工具和数据源的软件服务。
- **示例**：Slack, Google Drive, GitHub, PostgreSQL。
- **功能**：作为“包装器”，接收来自客户端的请求，并将其转换为对原始工具 API 的调用，然后将结果返回给客户端。
- **来源**：部分服务器由服务提供商开发，但也有大量第三方开发者贡献。


![alt text](../images/3.7.2.png)
---

## 三、MCP 的能力范围

- **初始设计**：侧重于为 LLM 提供更多上下文，最初的工具主要是用于“获取数据”（fetch data）。
- **当前发展**：MCP 的能力已扩展，不仅能访问数据，还能调用更通用的功能和执行操作。在 MCP 文档中，这些统称为“资源”（resources）。

---

## 实际演示：Claude Desktop 使用 GitHub MCP 服务器

1.  **场景**：用户在 Claude Desktop 中输入查询：“总结该 GitHub 仓库的 README 文件内容”，并附上 URL。
2.  **流程**：
    - Claude Desktop 作为 MCP 客户端，识别到这是一个需要访问 GitHub 的请求。
    - 它向已连接的 GitHub MCP 服务器发送一个请求，参数包含文件路径 (`README.md`)、仓库名 (`aisuite`) 和所有者 (`andrewng`)。
    - GitHub MCP 服务器执行请求，从仓库下载文件内容。
    - 服务器将长文本响应返回给 Claude Desktop。
    - Claude Desktop 将接收到的内容反馈给 LLM，LLM 生成一份简洁、格式良好的摘要。
3.  **第二次查询**：用户询问“有哪些最新的 Pull Request?”。
    - 同样，客户端向服务器发送“List pull requests”的请求。
    - 服务器返回 JSON 格式的拉取请求列表。
    - LLM 将其整理成清晰易读的列表，包括标题、状态、作者和描述等信息。
